import time
from idlelib.iomenu import errors

from django.http import JsonResponse
from django.utils.deprecation import MiddlewareMixin

from utils.MyJWT import myjwt
from utils.myjwtt import mjwt


class PermitionMiddleware(MiddlewareMixin):
    def process_request(self, request):
        # 定义一个白名单
        wlist = ["/user/password/", "/user/loginCapt/", "/user/Captcha/", '/user/getdinglogin/',
                 '/user/dingtalkCallback/','/user/quit/']
        url = request.path

        if url not in wlist:
            try:
                token = request.headers.get('Authorization')
                token = token.split(' ')[1]
                data = myjwt.Checktoken(token)
                now = int(time.time())
                # 假设 token 的有效期阈值为 300 秒（5 分钟）
                expiration_threshold = data['exp']
                remaining_time = data['exp'] - now

                if now > data['exp']:
                    return JsonResponse({"code": 401, "message": "token过期"})
                elif remaining_time <= expiration_threshold:
                    # 生成新的 token
                    new_token = mjwt.jwt_decode(data,new_expiration=time.time() + 3600)  # 假设新 token 有效期为 1 小时
                    # 将新的 token 添加到响应中
                    response = JsonResponse({"code": 200, "message": "token即将过期，已刷新", "new_token": new_token})
                    response['Authorization'] = new_token  # 也可以选择在响应头中设置新 token，但通常通过 JSON 返回更灵活
                    return response
                else:
                    # 检查用户是否已退出（这里假设 myjwt.get_str(token) 用于检查某种退出状态）
                    value = myjwt.getToken(token)
                    if value:
                        return JsonResponse({"code": 401, "message": "用户已经退出，非法操作"})
                    # 如果 token 有效且未即将过期，继续处理请求
                    return None  # 表示中间件不拦截请求，继续到下一个中间件或视图
            except Exception as e:
                print(e)
            except:

                return JsonResponse({"code": 401, "message": "操作异常"})
        # 如果 URL 在白名单中，不执行任何操作，继续处理请求
        return None
